home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / video.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  16KB  |  729 lines

  1. #include <curses.h>
  2. #include <string.h>
  3. #include "fractint.h"
  4. #include "prototyp.h"
  5.  
  6. /*
  7.  * This file contains Unix versions of the routines in video.asm
  8.  * Copyright 1992 Ken Shirriff
  9.  */
  10.  
  11. extern int colors,rotate_lo,rotate_hi;
  12. extern int boxx[],boxy[],boxcount;
  13.  
  14. extern unsigned char *xgetfont();
  15.  
  16. WINDOW *curwin;
  17.  
  18. extern int boxcount;
  19. extern int dotmode;
  20. extern int sxdots,sydots,sxoffs,syoffs;
  21. int daclearn = 0;
  22. int dacnorm = 0;
  23. int daccount = 0;
  24. int ShadowColors;
  25. int goodmode    =    0;    /* if non-zero, OK to read/write pixels */
  26. void (*dotwrite)(int, int, int);
  27.                 /* write-a-dot routine */
  28. int (*dotread)(int, int);     /* read-a-dot routine */
  29. void (*linewrite)();        /* write-a-line routine */
  30. void (*lineread)();        /* read-a-line routine */
  31. int andcolor    =    0;      /* "and" value used for color selection */
  32. int diskflag    =    0;    /* disk video active flag */
  33.  
  34. int videoflag    =    0;    /* special "your-own-video" flag */
  35.  
  36. void (*swapsetup)(void)    =NULL;    /* setfortext/graphics setup routine */
  37. int color_dark    =    0;    /* darkest color in palette */
  38. int color_bright    =0;    /* brightest color in palette */
  39. int color_medium    =0;    /* nearest to medbright grey in palette
  40.                    Zoom-Box values (2K x 2K screens max) */
  41. int boxcolor    =    0;    /* Zoom-Box color */
  42. int reallyega    =    0;    /* 1 if its an EGA posing as a VGA */
  43. int gotrealdac    =    0;    /* 1 if loaddac has a dacbox */
  44. int rowcount    =    0;    /* row-counter for decoder and out_line */
  45. int video_type    =    0;    /* actual video adapter type:
  46.                     0  = type not yet determined
  47.                     1  = Hercules
  48.                     2  = CGA (assumed if nothing else)
  49.                     3  = EGA
  50.                     4  = MCGA
  51.                     5  = VGA
  52.                     6  = VESA (not yet checked)
  53.                    11  = 8514/A (not yet checked)
  54.                    12  = TIGA    (not yet checked)
  55.                    13  = TARGA    (not yet checked)
  56.                    100 = x monochrome
  57.                    101 = x 256 colors
  58.                    */
  59. int svga_type    =    0;    /*  (forced) SVGA type
  60.                     1 = ahead "A" type
  61.                     2 = ATI
  62.                     3 = C&T
  63.                     4 = Everex
  64.                     5 = Genoa
  65.                     6 = Ncr
  66.                     7 = Oak-Tech
  67.                     8 = Paradise
  68.                     9 = Trident
  69.                    10 = Tseng 3000
  70.                    11 = Tseng 4000
  71.                    12 = Video-7
  72.                    13 = ahead "B" type
  73.                    14 = "null" type (for testing only) */
  74. int mode7text    =    0;    /* nonzero for egamono and hgc */
  75. int textaddr    =    0xb800;    /* b800 for mode 3, b000 for mode 7 */
  76. int textsafe    =    0;    /* 0 = default, runup chgs to 1
  77.                   1 = yes
  78.                   2 = no, use 640x200
  79.                   3 = bios, yes plus use int 10h-1Ch
  80.                   4 = save, save entire image */
  81. int text_type    =    1;    /* current mode's type of text:
  82.                     0  = real text, mode 3 (or 7)
  83.                     1  = 640x200x2, mode 6
  84.                     2  = some other mode, graphics */
  85. int textrow     =    0;    /* for putstring(-1,...) */
  86. int textcol     =    0;    /* for putstring(..,-1,...) */
  87. int textrbase    =    0;    /* textrow is relative to this */
  88. int textcbase    =    0;    /* textcol is relative to this */
  89. extern unsigned char dacbox[];
  90. int vesa_detect =    1;    /* set to 0 to disable VESA-detection */
  91.  
  92. /*
  93.  
  94. ;        |--Adapter/Mode-Name------|-------Comments-----------|
  95.  
  96. ;        |------INT 10H------|Dot-|--Resolution---|
  97. ;        |key|--AX---BX---CX---DX|Mode|--X-|--Y-|Color|
  98. */
  99.  
  100. struct videoinfo videotable[MAXVIDEOTABLE] = {
  101.     {"xfractint mode           ","                         ",
  102.      999, 0,     0,   0,   0,    19, 640, 480,  256},
  103.     {"unused  mode             ","                         ",
  104.      0, 0,     0,   0,   0,    0, 0, 0,  0},
  105.        };
  106.  
  107. void setforgraphics();
  108.  
  109. void
  110. nullwrite(a,b,c)
  111. int a,b,c;
  112. {}
  113.  
  114. int
  115. nullread(a,b)
  116. int a,b;
  117. {
  118.     return 0;
  119. }
  120.  
  121. void setnullvideo()
  122. {
  123.     dotwrite = nullwrite;
  124.     dotread = nullread;
  125. }
  126.  
  127. void normalineread();
  128. void normaline();
  129.  
  130. /*
  131. ; ********************** Function setvideotext() ************************
  132.  
  133. ;       Sets video to text mode, using setvideomode to do the work.
  134. */
  135. void
  136. setvideotext() {
  137.     dotmode = 0;
  138.     setvideomode(3,0,0,0);
  139. }
  140.  
  141. /*
  142. ; **************** Function setvideomode(ax, bx, cx, dx) ****************
  143. ;       This function sets the (alphanumeric or graphic) video mode
  144. ;       of the monitor.   Called with the proper values of AX thru DX.
  145. ;       No returned values, as there is no particular standard to
  146. ;       adhere to in this case.
  147.  
  148. ;       (SPECIAL "TWEAKED" VGA VALUES:  if AX==BX==CX==0, assume we have a
  149. ;       genuine VGA or register compatable adapter and program the registers
  150. ;       directly using the coded value in DX)
  151.  
  152. ; Unix: We ignore ax,bx,cx,dx.  dotmode is the "mode" field in the video
  153. ; table.  We use mode 19 for the X window.
  154. */
  155. void
  156. setvideomode(ax,bx,cx,dx)
  157. int ax,bx,cx,dx;
  158. {
  159.     if (diskflag) {
  160.     enddisk();
  161.     }
  162.     if (videoflag) {
  163.     endvideo();
  164.     videoflag = 0;
  165.     }
  166.     goodmode = 1;
  167.     switch (dotmode) {
  168.     case 0: /* text */
  169.         clear();
  170.         /*
  171.         touchwin(curwin);
  172.         */
  173.         wrefresh(curwin);
  174.         break;
  175.     case 11:
  176.         startdisk();
  177.         dotwrite = writedisk;
  178.         dotread = readdisk;
  179.         lineread = normalineread;
  180.         linewrite = normaline;
  181.         break;
  182.     case 19: /* X window */
  183.         wclear(curwin); /* ???? */
  184.         putstring(0, 0, 0,
  185.             "Press operation key, or <Esc> to return to Main Menu");
  186.         wrefresh(curwin);
  187.         dotwrite = writevideo;
  188.         dotread = readvideo;
  189.         lineread = readvideoline;
  190.         linewrite = writevideoline;
  191.         videoflag = 1;
  192.         startvideo();
  193.         setforgraphics();
  194.         break;
  195.     default:
  196.         printf("Bad mode %d\n", dotmode);
  197.         exit(-1);
  198.     } 
  199.     if (dotmode !=0) {
  200.     loaddac();
  201.     andcolor = colors-1;
  202.     boxcount =0;
  203.     }
  204. }
  205.  
  206. loaddac()
  207. {
  208.     readvideopalette();
  209. }
  210.  
  211.  
  212. /*
  213. ; **************** Function getcolor(xdot, ydot) *******************
  214.  
  215. ;       Return the color on the screen at the (xdot,ydot) point
  216. */
  217. int
  218. getcolor(xdot,ydot)
  219. int xdot,ydot;
  220. {
  221.     int x1,y1;
  222.     x1 = xdot+sxoffs;
  223.     y1 = ydot+syoffs;
  224.     if (x1<0 || y1<0 || x1>=sxdots || y1>=sydots) return 0;
  225.     return dotread(x1,y1);
  226. }
  227.  
  228. /*
  229. ; ************** Function putcolor(xdot, ydot, color) *******************
  230.  
  231. ;       write the color on the screen at the (xdot,ydot) point
  232. */
  233. void
  234. putcolor(xdot,ydot,color)
  235. int xdot,ydot,color;
  236. {
  237.     dotwrite(xdot+sxoffs,ydot+syoffs,color&andcolor);
  238. }
  239.  
  240. /*
  241. ; **************** Function movecursor(row, col)  **********************
  242.  
  243. ;       Move the cursor (called before printfs)
  244. */
  245. void
  246. movecursor(row,col)
  247. int row, col;
  248. {
  249.     if (row==-1) {
  250.     row = textrow;
  251.     } else {
  252.     textrow = row;
  253.     }
  254.     if (col==-1) {
  255.     col = textcol;
  256.     } else {
  257.     textcol = col;
  258.     }
  259.     wmove(curwin,row,col);
  260. }
  261.  
  262. /*
  263. ; **************** Function keycursor(row, col)  **********************
  264.  
  265. ;       Subroutine to wait cx ticks, or till keystroke pending
  266. */
  267. keycursor(row,col)
  268. {
  269.     int ch;
  270.     movecursor(row,col);
  271.     wrefresh(curwin);
  272.     waitkeypressed(0);
  273.     return getakey();
  274. }
  275.  
  276. /*
  277. ; PUTSTR.asm puts a string directly to video display memory. Called from C by:
  278. ;    putstring(row, col, attr, string) where
  279. ;         row, col = row and column to start printing.
  280. ;         attr = color attribute.
  281. ;         string = far pointer to the null terminated string to print.
  282. ;    Written for the A86 assembler (which has much less 'red tape' than MASM)
  283. ;    by Bob Montgomery, Orlando, Fla.             7-11-88
  284. ;    Adapted for MASM 5.1 by Tim Wegner          12-11-89
  285. ;    Furthur mucked up to handle graphics
  286. ;       video modes by Bert Tyler                 1-07-90
  287. ;    Reworked for:  row,col update/inherit;
  288. ;       620x200x2 inverse video;  far ptr to string;
  289. ;       fix to avoid scrolling when last posn chgd;
  290. ;       divider removed;  newline ctl chars;  PB  9-25-90
  291. */
  292. void
  293. putstring(row, col, attr, msg)
  294. int row,col, attr;
  295. CHAR far *msg;
  296. {
  297.     int so=0;
  298.  
  299.     if (row!=-1) textrow = row;
  300.     if (col!=-1) textcol = col;
  301.  
  302.     if (attr & INVERSE || attr & BRIGHT) {
  303.     wstandout(curwin);
  304.     so = 1;
  305.     }
  306.     wmove(curwin,textrow+textrbase, textcol+textcbase);
  307.     while (1) {
  308.     if (*msg=='\0') break;
  309.     if (*msg=='\n') {
  310.         textcol = 0;
  311.         textrow++;
  312.         wmove(curwin,textrow+textrbase, textcol+textcbase);
  313.     } else {
  314.         char *ptr;
  315.         ptr = strchr(msg,'\n');
  316.         if (ptr==NULL) {
  317.         waddstr(curwin,msg);
  318.         break;
  319.         } else {
  320.         waddch(curwin,*msg);
  321.         }
  322.     }
  323.     msg++;
  324.     }
  325.     if (so) {
  326.     wstandend(curwin);
  327.     }
  328.  
  329.     wrefresh(curwin);
  330.     fflush(stdout);
  331.     getyx(curwin,textrow,textcol);
  332.     textrow -= textrbase;
  333.     textcol -= textcbase;
  334. }
  335.  
  336. /*
  337. ; setattr(row, col, at